#!/usr/bin/perl -w

use cm2bug;
use Getopt::Long;
use File::Basename;
use Data::Dumper;

$_PRG=basename($0);

sub usage {
	print STDERR "
Usage: $_PRG --table X [--dbfile D] [--clause Y]

";
	exit(1);
}

$ARG_dbfile="dbfile";
if(!GetOptions(
	"dbfile=s"	=> \$ARG_dbfile,
	"table=s"	=> \$ARG_table,
	"clause=s"	=> \$ARG_clause
)) {
	usage;
}

if(!defined($ARG_table)) { usage; }

if(! -f $ARG_dbfile) {
	print STDERR "Error: Specified database file does not exist!\n";
	exit 1;
}

$DBH = cm2bug->new($ARG_dbfile);
if(!defined($DBH)) {
	($rc,$str)=cm2bug->error;
	print STDERR "Error: $str [rc=$rc]\n";
	exit 1;
}

if(!$DBH->exists("table",$ARG_table)) {
	print STDERR "Error: Table \"$ARG_table\" does not exist.\n";
	exit 1;
}

if(!defined($ARG_clause)) {
	$cmd="SELECT * FROM $ARG_table;";
} else {
	$cmd="SELECT * FROM $ARG_table $ARG_clause;";
}

$aref=$DBH->get_rows($cmd);
$cc=0;
if(!defined($aref)) {
	($cc,$rc)=$DBH->error;
	print "Error attempting to list table\n$rc\n";
	exit 1;
}

@R=@$aref;
exit if (!@R);

#########################################################################
# Default column widths to display determined by the name of column.	#
#########################################################################

@widths=();
@values=();

$i=0;
for $ckey (keys(%{$R[0]})) {
	$widths[$i]=length($ckey);
	$values[$i]=0;
	$i++;
}

#########################################################################
# Widen the column widths to cope with data if necessary.		#
#########################################################################
for $aa (@R) {
	$i=0;
	for $ckey (keys(%$aa)) {
		$l=0;
		$l=length($aa->{$ckey}) if defined($aa->{$ckey});
		$values[$i]++ if $l;
		$widths[$i]=0 if !defined($widths[$i]);
		$widths[$i]=$l if $l > $widths[$i];
		$i++;
	}
}

#########################################################################
# If a column has no values, then do not print it.			#
#########################################################################

$i=0;
$r="";
for $ckey (keys(%{$R[0]})) {
	if($values[$i]) {
		$r.=sprintf("%-*s  ",$widths[$i],$ckey);
	}
	$i++;
}
print "$r\n";

$i=0; $r="";
for $ckey (keys(%{$R[0]})) {
	if($values[$i]) {
		$r.="=" x $widths[$i];
		$r.="  ";
	}
	$i++;
}
print "$r\n";

#########################################################################
# Now dump out all records.						#
#########################################################################

for $aa (@R) {
	$i=0;
	$r="";
	for $ckey (keys(%$aa)) {
		if($values[$i]) {
			if(defined($aa->{$ckey})) {
				$r.=sprintf("%-*s  ",$widths[$i],$aa->{$ckey});
			} else {
				$r.="  "." " x $widths[$i];
			}
		}
		$i++;
	}
	print "$r\n";
}
print "\n";
print scalar(@R)." Record" . (scalar(@R)==1 ? "" : "s") . " found.\n";
exit 0;
